package com.xu.mvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * SpringMVC 域对象共享数据
 *
 * 1.三种域对象
 *
 * 1.1 request
 *
 * request 是表示一个请求，只要发出一个请求就会创建一个 request，它的作用域：仅在当前请求中有效。
 * 用处：常用于服务器间同一请求不同页面之间的参数传递，常应用于表单的控件值传递。
 *
 * 1.2 session
 *
 * 服务器会为每个会话创建一个 session 对象，所以 session 中的数据可供当前会话中所有 servlet 共享。
 * 会话：用户打开浏览器会话开始，直到关闭浏览器会话才会结束。一次会话期间只会创建一个 session 对象。
 * 用处：常用于 web 开发中的登陆验证界面（当用户登录成功后浏览器分配其一个 session 键值对）。
 *
 * 1.3 application
 *
 * 所有的用户都可以取得此信息，此信息在整个服务器上被保留。application 属性范围值，只要设置一次，
 * 则所有的网页窗口都可以取得数据。ServletContext 在服务器启动时创建，在服务器关闭时销毁，一个
 * JavaWeb 应用只创建一个 ServletContext 对象，所有的客户端在访问服务器时都共享同一个 ServletContext 对象;
 * ServletContext 对象一般用于在多个客户端间共享数据时使用;
 *
 * 2. 使用 ServletAPI 向 request 域对象共享数据
 *
 * 直接往 HttpServletRequest 类对象中设置键值就可以，并且不需要特地将 request 对象返回，底层 springmvc 在
 * 处理的时候，会将模型数据 model 和视图最终包装成一个 ModelAndView 对象
 * request.setAttribute("testRequestScope", "hello, servletAPI");
 *
 * 3. 使用 ModelAndView 向 request 域对象共享数据
 *
 * ModelAndView 有 Model 和 View 的功能，Model 主要用于向请求域共享数据，View 主要用于设置视图，实现页面跳转
 * 并且必须返回 ModelAndView 才能起作用，而 上面的 HttpServletRequest 就不需要返回
 *
 * 4. 使用 Model 向 request 域对象共享数据
 *
 * 5. 使用 Map 向 request 域对象共享数据
 *
 * 6. 使用 ModelMap 向 request 域对象共享数据
 *
 * 7. Model、ModelMap、Map 的关系：Model、ModelMap、Map 类型的参数其实本质上都是 BindingAwareModelMap 类型的，另外，不管
 *    使用的是 2-6 中的哪个方法，springmvc 都会将 controller 的返回值包装成 ModelAndView 类对象
 *    public interface Model{}
 *    public class ModelMap extends LinkedHashMap<String, Object> {}
 *    public class ExtendedModelMap extends ModelMap implements Model {}
 *    public class BindingAwareModelMap extends ExtendedModelMap {}
 *
 * 8. 向 session 域共享数据
 *
 * 9. 向 application 域共享数据
 */


@Controller
public class HelloController {

    @RequestMapping("/")
    public String index(){
        // 返回视图名称，即加上配置视图解析器时，指定的前缀和后缀
        return "index";
    }

    @RequestMapping("/target")
    public String toTarget(){
        return "target";
    }

}
